package whf.framework.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import whf.framework.exception.DAOException;
import whf.framework.exception.FindException;
import whf.framework.exception.NotFoundException;
import whf.framework.util.Utils;

/**
 * @author wanghaifeng
 *
 */
public interface FindService<T> {
	public final static List EMPTY_LIST = Utils.newArrayList();

	/**
	 * 通过代码搜索，一般的代码表示唯一代码
	 * @modify wanghaifeng Sep 14, 2006 9:43:18 PM
	 * @param code
	 * @return
	 * @throws FindException
	 */
	public T findByCode(String code) throws FindException;
    //with rows
	/**
	 * @return 所有业务对象列表，第一个对象为其数目
	 * @throws FindException 查找失败异常
	 */
	public List<T> findAll() throws FindException;

	/**
	 * @param start开始位置
	 * @param end 行数每页
	 * @return 对象列表，第一个对象为满足条件的对象数
	 * @throws FindException 查找失败异常
	 */
	public List<T> findAll(int start,int pageSize) throws FindException;
	
    // find functions, withour rows
	/**
	 * @param query 搜索字符串
	 * @return 对象列表，不包括行数
	 * @throws FindException 查找失败异常
	 */
    public List<T> find(String query) throws FindException;

	/**
	 * @param query 有一个参数的搜索字符串
	 * @param arg 参数
	 * @return 对象列表
	 * @throws FindException 搜索失败异常
	 */
    public List<T> find(String query,Object arg) throws FindException;

	/**
	 * @param query 有多个参数的搜索字符串
	 * @param args 参数列表
	 * @return 对象列表
	 * @throws FindException 查找失败异常
	 */
    public List<T> find(String query,Object[] args) throws FindException;
    
    // list functions, without rows
	/**
	 * @param queryString 无参数搜索字符串
	 * @param start 开始位置
	 * @param rowsPerPage 行数每页
	 * @return 对象列表
	 */
    public List<T> list(String queryString, int start, int rowsPerPage);

	/**
	 * @param queryString 多参数搜索字符串
	 * @param paramValues 参数值
	 * @param start 开始位置
	 * @param rowsPerPage 行数每页
	 * @return 对象列表
	 */
    public List<T> list(String queryString, Object[] paramValues, int start, int rowsPerPage);

	/**
	 * @param queryString 多参数搜索字符串，参数用参数名形式表示，如fieldxxx=?paramname
	 * @param paramNames 参数名列表
	 * @param paramValues 参数值列表，与参数名对应
	 * @param start 开始位置
	 * @param rowsPerPage 行数每页
	 * @return 对象列表
	 */
    public List<T> list(String queryString, String[] paramNames, Object[] paramValues, int start, int rowsPerPage);

    //row count functions
	/**
	 * 获取对象数目
	 * @param conditionString 无参数where子句
	 * @return 搜索满足条件对象数目
	 * @throws FindException 操作异常
	 */
	public int getRowCount(String conditionString) throws DAOException;
	/**
	 * 获取对象数目
	 * @param fromAndWhere 带参数搜索字符串
	 * @param params 参数值
	 * @return 满足搜索条件对象数目
	 * @throws FindException 查找异常
	 */
    public int getRowCount(String fromAndWhere,Object[] params) throws FindException;
	
	/**
	 * 根据字符串查询
	 * @param queryString 查询条件字符串
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString) throws FindException;
	
	/**
	 * 带参数的字符串查询，查询结果非lazy式获取
	 * @param queryString
	 * @param params
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object[] params) throws FindException;

	/**
	 * 对所有属性使用非lazy模式取值
	 * @param key
	 * @return
	 * @throws NotFoundException
	 */
	public T findByPrimaryKeyWithoutLazy(Serializable key) throws NotFoundException;

	/**
	 * 安对象属性为条件取值进行查询
	 * @param properties
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findByProperty(Map<String, Object> properties, int start, int pageSize) throws FindException ;

	/**
	 * 对查询出的所有业务对象使用非lazy式获取，适用于分页
	 * @param queryString
	 * @param start 开始记录位置
	 * @param pageSize 每页大小
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, int start, int pageSize) throws FindException ;

	/**
	 * 带一个参数的非lazy式查询，并可分页
	 * @param queryString
	 * @param arg
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object arg, int start, int pageSize) throws FindException ;

	/**
	 * 带一个参数的非lazy查询
	 * @param queryString
	 * @param arg
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object arg) throws FindException ;
	
	/**
	 * 带多参数的字符串查询，支持分页；
	 * @param queryString
	 * @param params
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findWithoutLazy(String queryString, Object[] params, int start, int pageSize) throws FindException ;

	/**
	 * 非lazy式的查询所有对象
	 * @return
	 * @throws FindException
	 */
	public List<T> findAllWithoutLazy() throws FindException ;

	/**
	 * 非lazy式的查询所有对象，支持分页
	 * @param start
	 * @param pageSize
	 * @return
	 * @throws FindException
	 */
	public List<T> findAllWithoutLazy(int start, int pageSize) throws FindException ;
	
	/**
	 * 不支持模糊查询，参照业务对象搜索，搜索条件：
	 * 1、数字等属性如果是0则忽略，其它则作为查询条件
	 * 2、字符串属性空则忽略，其它则作为查询条件
	 * 3、日期属性null忽略，其它作为查询条件
	 * 4、many-to-one属性如果是null忽略，其它查询
	 * 5、collection属性中如果空则忽略，其它则要求每一个对象都in结果中的对象
	 * @modify wanghaifeng Aug 25, 2006 12:50:25 PM
	 * @param condition
	 * @return
	 * @throws FindException
	 */
//	public List<T> searchByBO(T condition, int start, int pageSize) throws FindException;
	
	/**
	 * 以一个对象作为查询条件实现查询
	 * @modify wanghaifeng Aug 25, 2006 12:50:25 PM
	 * @param condition
	 * @return
	 * @throws FindException
	 */
//	public List<T> searchByBOWithoutLazy(T condition, int start, int pageSize) throws FindException;
}
